package com.poopinggames.juego1;

import java.util.ArrayList;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.util.Log;

public class Pieza implements Colisionable {
	private int id;
	private static final String TAG = "Pieza";
	private int number;
	private static int count = 0;
	public Pieza piezaLeft = null;
	public Pieza piezaRight = null;
	public Pieza piezaTop = null;
	public Pieza piezaBottom = null;
	public float x = 0;
	public float y = 0;
	public float width = 100;
	public float height = 100;
	private boolean pared = false;
	private int color = Color.GREEN;
	private int textColor = Color.BLACK;
	public static ArrayList<Pieza> piezas = new ArrayList<Pieza>();
	public Pieza(int number) {
		this.number = number;

		id = count;
		count++;
		piezas.add(this);
		Log.d(TAG,"van " + piezas.size() + " piezas" );
	}

	public Pieza(int number, float x, float y) {
		super();
		this.number = number;
		this.x = x;
		this.y = y;
		id = count;
		count++;
		piezas.add(this);
		Log.d(TAG,"van " + piezas.size() + " piezas" );
	}

	public boolean checkOnClick(float x, float y) {
		return (x >= this.x && x <= this.x + width && y >= this.y && y <= this.y
				+ height) ? true : false;

	}

	public Pieza(boolean pared, float x, float y) {
		super();
		number = -1;
		this.pared = pared;
		this.x = x;
		this.y = y;
		id = count;
		count++;
		piezas.add(this);
		Log.d(TAG,"van " + piezas.size() + " piezas" );
	}

	public boolean isPared() {
		return pared;
	}

	private float maxMoveX(float dx) {
		//boolean move = true;
		float maxMove=dx;
		for (int i=0;i<piezas.size();i++){
			if (id != i){
				float thisMove = maxMove;
				if (dx>=0){
					if (checkColisionRight(piezas.get(i), dx)){
						float distToPieza = piezas.get(i).x-(x + width);
						//thisMove = thisMove<0 ? 0 : thisMove;
						if (piezas.get(i).isPared()){
							maxMove = distToPieza<=maxMove ? distToPieza : maxMove;
							
							
						}else {
							thisMove = piezas.get(i).maxMoveX(dx-distToPieza) + dx; 
							maxMove = thisMove<=maxMove ? thisMove : maxMove;
						}
						
						
					}
				}else{
					if (checkColisionLeft(piezas.get(i), dx)){
						float distToPieza = piezas.get(i).x + piezas.get(i).width-x;
						//thisMove = thisMove<0 ? 0 : thisMove;
						if (piezas.get(i).isPared()){
							maxMove = distToPieza>=maxMove ? distToPieza : maxMove;
							
							
						}else {
							thisMove = piezas.get(i).maxMoveX(dx-distToPieza) + dx; 
							maxMove = thisMove>=maxMove ? thisMove : maxMove;
						}
					}
				}
				
			}
		}
		return maxMove;
	}
	
	public void moveX(float dx){
		float maxMove=maxMoveX(dx);
		
		for (int i=0;i<piezas.size();i++){
			if (id!=i){
				if (dx>=0){
					if (checkColisionRight(piezas.get(i), maxMove)){
						Log.d(TAG,"Pieza "+ id + " con Pieza " + i + " Right");
						final float distToPieza = piezas.get(i).x-(x + width);
						if (piezas.get(i).isPared()==false){
							final float distToMove=maxMove - distToPieza <=0 ? 0 :maxMove - distToPieza; 
							piezas.get(i).moveX(distToMove);
						
						}
					}
				}else {
					if (checkColisionLeft(piezas.get(i), maxMove)){
						Log.d(TAG,"Pieza "+ id + " con Pieza " + i + " Left");
						final float distToPieza = piezas.get(i).x + piezas.get(i).width-(x);
						if (piezas.get(i).isPared()==false){
							final float distToMove=maxMove - distToPieza >=0 ? 0 :maxMove - distToPieza; 
							piezas.get(i).moveX(distToMove);
						
						}
					}
				}
				
			}
		}
		x+=maxMove;
		//Log.d(TAG,"id = " + id + "maxMove = " +maxMove);
	}
	public static void drawPiezas (Canvas canvas){
		for (int i =0; i<piezas.size();i++){
			piezas.get(i).drawMe(canvas);
		}
		
	}
	public boolean moveRight(float dx) {
		if (piezaRight == null) {
			x += dx;
			return true;
		} else if (piezaRight.isPared()) {
			return false;
		} else {
			if (piezaRight.moveRight(dx)) {
				x += dx;
				return true;
			}
			return false;
		}
	}

	public boolean moveTop(float dy) {
		if (piezaTop == null) {
			y -= dy;
			return true;
		} else if (piezaTop.isPared()) {
			return false;
		} else {
			if (piezaTop.moveTop(dy)) {
				y -= dy;
				return true;
			}
			return false;
		}
	}
	
	

	public boolean moveBottom(float dy) {
		if (piezaBottom == null) {
			y += dy;
			return true;
		} else if (piezaBottom.isPared()) {
			return false;
		} else {
			if (piezaBottom.moveBottom(dy)) {
				y += dy;
				return true;
			}
			return false;
		}
	}

	public void drawMe(Canvas canvas) {
		Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		paint.setColor(color);
		paint.setTextSize(height / 2);

		canvas.drawRect(x, y, x + width, y + height, paint);
		paint.setColor(textColor);
		paint.setTextAlign(Align.CENTER);
		canvas.drawText("" + number, x + width / 2,
				y + height / 2 + paint.getTextSize() / 2, paint);

	}

	@Override
	public boolean checkColisionRight(Pieza pieza, float dx) {
		if (pieza.x > x) {			
			if (x + dx+ width >= pieza.x && y + height > pieza.y
					&& y <= pieza.y + pieza.height) {
				return true;
			}
		}
		return false;
	}

	@Override
	public boolean checkColisionLeft(Pieza pieza, float dx) {
		if (pieza.x <= x) {
			if (x + dx <= pieza.x + pieza.width && y + height >= pieza.y
					&& y <= pieza.y + pieza.height) {
				return true;
			}
		}
		return false;
	}
	@Override
	public boolean checkColisionTop(Pieza pieza, float dy) {
		if (pieza.y < y) {
			if (y + dy <= pieza.y+pieza.width && x + width >= pieza.x
					&& x <= pieza.x + pieza.width) {
				return true;
			}
		}
		return false;
	}

	@Override
	public boolean checkColisionBottom(Pieza pieza, float dy) {
		if (pieza.y > y) {
			if (y+height + dy >= pieza.y && x + width >= pieza.x
					&& x <= pieza.x + pieza.width) {
				return true;
			}
		}
		return false;
	}
	


}
